// Package middleware 提供HTTP中间件功能
// 该包实现了JWT认证中间件，用于保护API路由
package middleware

import (
	"aigen-todo/internal/config"
	"strings"

	"github.com/gofiber/fiber/v2"
	"github.com/golang-jwt/jwt/v4"
)

// JWTAuth 创建JWT认证中间件
// 该中间件验证请求中的JWT令牌并提取用户ID
// 参数:
//
//	cfg - 应用程序配置，包含JWT密钥
//
// 返回值:
//
//	fiber.Handler - Fiber中间件处理函数
func JWTAuth(cfg *config.Config) fiber.Handler {
	// 返回中间件处理函数
	return func(c *fiber.Ctx) error {
		// 从请求头获取Authorization字段
		authHeader := c.Get("Authorization")
		if authHeader == "" {
			// 如果没有Authorization头，返回401未授权错误
			return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
				"code":    fiber.StatusUnauthorized,
				"success": false,
				"message": "用户未登录",
			})
		}

		// 提取JWT令牌
		// 移除"Bearer "前缀获取纯令牌
		tokenString := strings.Replace(authHeader, "Bearer ", "", 1)
		if tokenString == "" {
			return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
				"code":    fiber.StatusUnauthorized,
				"success": false,
				"message": "用户未登录",
			})
		}

		// 解析和验证JWT令牌
		token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
			// 返回用于验证令牌的密钥
			return []byte(cfg.JWT.Secret), nil
		})

		// 检查令牌是否有效
		if err != nil || !token.Valid {
			return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
				"code":    fiber.StatusUnauthorized,
				"success": false,
				"message": "用户未登录",
			})
		}

		// 从令牌中提取用户ID并存储在上下文中
		if claims, ok := token.Claims.(jwt.MapClaims); ok {
			if userID, ok := claims["user_id"].(float64); ok {
				// 将用户ID存储在Fiber上下文中，供后续处理器使用
				c.Locals("user_id", uint64(userID))
			}
		}

		// 继续处理请求
		return c.Next()
	}
}
